/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class CmdFor {

    CmdWhile cmdWhile = new CmdWhile();
    cmd cmd = new cmd();
    ExpAtribuicaoFor expAtribFor = new ExpAtribuicaoFor();

    public boolean sintaxeCmdFor(TabelaSimbolos tabelaSimbolos) {



        if(tabelaSimbolos.reconhecer("for")){
        if (tabelaSimbolos.reconhecer("(")) {
            if (verificaInicioAtribuicao(tabelaSimbolos)) {
                if (expAtribFor.sintaxeExpAtribuicaoFor(tabelaSimbolos)) {
                    if (tabelaSimbolos.reconhecer(";")) {
                        if (verificaInicioTermoRelacional(tabelaSimbolos)) {
                            if (TermoRelacional.termoRelacional(tabelaSimbolos)) {
                                if (tabelaSimbolos.reconhecer(";")) {
                                    if (ehIdentificador(tabelaSimbolos)) {

                                        tabelaSimbolos.soConsome();//consome o identificador

                                        if (tabelaSimbolos.getLookahead().equals("++")) {
                                            if (tabelaSimbolos.reconhecer("++")) {
                                            }
                                        } else if (tabelaSimbolos.getLookahead().equals("--")) {
                                            if (tabelaSimbolos.reconhecer("--")) {
                                            }

                                        } else if (tabelaSimbolos.getLookahead().equals("=")) {
                                            if (tabelaSimbolos.reconhecer("=")) {
                                                if (verificaExpAritmetica(tabelaSimbolos)) {
                                                    if(ExpressaoAritmetica.expAritmetica(tabelaSimbolos)){

                                                    }else{
                                                         ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " expressao aritmetica mal formada");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //expressao aritmetica mal formada
                                                    }

                                                } else {
                                                      ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " nao encontrou o inicio de uma expAritmetica");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                    return false; //nao encontrou o inicio de uma expAritmetica
                                                }
                                            }
                                        } else {
                                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " nao encontrou nem ++, nem --, nem +");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //nao encontrou nem ++, nem --, nem +
                                        }

                                        if (tabelaSimbolos.reconhecer(")")) {

                                            if (tabelaSimbolos.getLookahead().equals("{")) {
                                                if (tabelaSimbolos.reconhecer("{")) {
                                                    while (cmdWhile.verificaInicioCmd(tabelaSimbolos)) {
                                                        if (cmd.sintaxeCmd(tabelaSimbolos)) {
                                                            continue;
                                                        }
                                                    }
                                                    if (tabelaSimbolos.reconhecer("}"))//permite {} sem comando dentro
                                                    {
                                                        return true;
                                                    } else {
//                                                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " nao achou }");
//                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                        return false; //se nao achar }

                                                    }

                                                }
                                            } else if (cmdWhile.verificaInicioCmd(tabelaSimbolos)) {

                                                //quando o while só tem um comando (nao tem chaves)
                                                if (cmd.sintaxeCmd(tabelaSimbolos)) {
                                                    return true;
                                                } else {
                                                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Comando mal formado");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                    return false; //erro devido comando mal formado
                                                }
                                            } else {
                                                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao é nem cmd nem {cmd}");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                return false; //nao eh nem cmd nem {cmd}
                                            }

                                        } else {
                                                                                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao encontrou }");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                            return false; //nao encontrou )
                                        }
                                    } else {

                                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao encontrou um identificador");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                        return false; //nao encontrou identificador
                                    }
                                } else {
                                    ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao encontrou ;");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                    return false; //nao encontrou o segundo ;
                                }
                            } else {
                                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Expressao Relacional mal formada");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                return false; //expRelacional mal formada
                            }
                        } else {
                            System.out.println("444");
                            ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao encontrou o inicio de uma expressao relacional");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                            return false; //se nao encontrou o inicio de uma expressao relacional
                        }
                    } else {
                        ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha() + " Nao encontrou ;");
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se não encontrou o primeiro ;
                    }
                } else {

                    return false; // expAtribuicao mal formada
                }
            } else {


                System.out.println("111");
                ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;//se não encontrou o inicio de uma cadeia do tipo int i = 0 ou i = 0
            }
        } else {
            System.out.println("22222");
             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;//se nao achar (
        }
        }
        else{

            System.out.println("333333333333");
             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;//se nao encontrar o for
        }



        return true;
    }

    public boolean verificaInicioAtribuicao(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getLookahead().equals("int")) {
            return true;
        } else {
            return false;//sintaxe está errada se não encontrou uma cadeia do tipo int i = 0 ou i = 0
        }
    }

    //inicio de termo relacional
    public boolean verificaInicioTermoRelacional(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            return false;
        }
    }


    public boolean atribuicaoFor(TabelaSimbolos tabelaSimbolos) {
        return true;
    }

    public boolean ehIdentificador(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("identificador")) {
            return true;
        } else {
            return false;
        }
    }

    public boolean verificaExpAritmetica(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            return false;
        }
    }
}
